package com.ruboweb.report;

import org.apache.log4j.Logger;
import org.jasypt.util.text.BasicTextEncryptor;

import com.ruboweb.db.ConnectionDbHelper;
import com.ruboweb.domain.Config;
import com.ruboweb.domain.Perfil;
import com.ruboweb.domain.Report;

/**
 * Utilidades para la generacion de reports
 */
public final class ReportUtil {
	private static Logger logger = Logger.getLogger(ReportUtil.class);
	
	// Constantes
	public final static String SEPARADOR_DATOS = "#;#";
	private final static String CLAVE = "A8YkyuQDdlryIbu6zEaNUptAi7CnXypiFPtptUxobxUlZkCGj8";
	private final static String BASE = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/";
	private final static String B64 = "==";
	private final static int B64_SIZE = 22;
	private final static int TRASH = 20;

	/**
	 * Constructor de la clase
	 */
	private ReportUtil() {

	}

	/**
	 * Metodo para mostrar todos los reports
	 */
	public static void mostrarModelo() {

		Config model = ConnectionDbHelper.getInstance().getModel();
		if (model != null) {
			for (Perfil p : model.getPerfiles()) {
				for (Report r : p.getReports()) {
					System.out.println(p.getPerfil() + ": " + r.getInforme());
				}
			}
		}

	}

	/**
	 * Metodo para buscar un perfil en el XML
	 * 
	 * @param perfil
	 *            Nombre del perfil
	 * 
	 * @return Perfil en modelo java
	 */
	public static Perfil buscarPerfil(String perfil) {
		Config model = ConnectionDbHelper.getInstance().getModel();

		if (model != null) {
			for (Perfil p : model.getPerfiles()) {
				if (p.getPerfil().equals(perfil)) {
					return p;
				}
			}
		}
		return null;
	}

	/**
	 * Metodo para buscar un report en el XML
	 * 
	 * @param perfil
	 *            Nombre del perfil
	 * @param report
	 *            Nombre del report
	 * 
	 * @return Report en modelo java
	 */
	public static Report buscarReport(String perfil, String report) {
		Perfil perfilSelected = ReportUtil.buscarPerfil(perfil);

		if (perfilSelected != null) {
			for (Report r : perfilSelected.getReports()) {
				if (r.getInforme().equals(report)) {
					return r;
				}
			}
		}

		return null;
	}

	/**
	 * Metodo para cifrar cadenas
	 */
	public static String encrypt(String cadena) {
		try {
			BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
			textEncryptor.setPassword(ReportUtil.CLAVE);

			return textEncryptor.encrypt(cadena).replaceAll(ReportUtil.B64, "")
					+ ReportUtil.trash();

		} catch (Exception e) {
			ReportUtil.logger.error("Se ha producido un error al encriptar la cadena: " + cadena);
			ReportUtil.logger.error(e.getMessage());
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * Metodo para descifrar cadenas
	 */
	public static String decrypt(String cadena) {
		try {
			BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
			textEncryptor.setPassword(ReportUtil.CLAVE);

			return textEncryptor.decrypt(cadena.substring(0,
					ReportUtil.B64_SIZE) + ReportUtil.B64);
		} catch (Exception e) {
			ReportUtil.logger.error("Se ha producido un error al desencriptar la cadena: " + cadena);
			ReportUtil.logger.error(e.getMessage());
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * Utilidad para generar basura
	 */
	private static String trash() {

		String contrasena = "";

		for (int i = 0; i < ReportUtil.TRASH; i++) {
			int numero = (int) (Math.random() * (ReportUtil.BASE.length()));

			contrasena += ReportUtil.BASE.substring(numero, numero + 1);
		}

		return contrasena;
	}
}
